home *** CD-ROM | disk | FTP | other *** search
/ Programming an RTS Game with Direct3D / Programming an RTS Game with Direct3D.iso / Examples / Chapter 5 / Example 5.3 / camera.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2006-07-17  |  3.0 KB  |  125 lines

  1. #include "camera.h"
  2.  
  3. CAMERA::CAMERA()
  4. {
  5.     Init(NULL);
  6. }
  7.  
  8. void CAMERA::Init(IDirect3DDevice9* Dev)
  9. {
  10.     m_pDevice = Dev;
  11.     m_alpha = m_beta = 0.5f;
  12.     m_radius = 10.0f;
  13.     m_fov = D3DX_PI / 4.0f;
  14.  
  15.     m_eye = D3DXVECTOR3(50.0f, 50.0f, 50.0f);
  16.     m_focus = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
  17. }
  18.  
  19. void CAMERA::Scroll(D3DXVECTOR3 vec)
  20. {
  21.     D3DXVECTOR3 newFocus = m_focus + vec;
  22.  
  23.     if(newFocus.x > -50.0f && newFocus.x < 50.0f &&
  24.        newFocus.z > -50.0f && newFocus.z < 50.0f)
  25.        m_focus = newFocus;
  26. }
  27.  
  28. void CAMERA::Pitch(float f)
  29. {
  30.     m_beta += f;
  31.  
  32.     if(m_beta > D3DX_PI / 2.0f)m_beta = D3DX_PI / 2.0f - 0.01f;
  33.     if(m_beta < 0.3f)m_beta = 0.3f;
  34. }
  35.  
  36. void CAMERA::Yaw(float f)
  37. {
  38.     m_alpha += f;
  39.     if(m_alpha > D3DX_PI * 2.0f)m_alpha -= D3DX_PI * 2.0f;
  40.     if(m_alpha < -D3DX_PI * 2.0f)m_alpha += D3DX_PI * 2.0f;
  41. }
  42.  
  43. void CAMERA::Zoom(float f)
  44. {
  45.     m_fov += f;
  46.  
  47.     if(m_fov < 0.1f)m_fov = 0.1f;
  48.     if(m_fov > D3DX_PI / 2.0f)m_fov = D3DX_PI / 2.0f;
  49. }
  50.  
  51. void CAMERA::ChangeRadius(float f)
  52. {
  53.     m_radius += f;
  54.  
  55.     if(m_radius < 5.0f)m_radius = 5.0f;
  56.     if(m_radius > 100.0f)m_radius = 100.0f;
  57. }
  58.  
  59. void CAMERA::Update(MOUSE &mouse, float timeDelta)
  60. {
  61.     //Restrict focus movment to the xz-plane
  62.     m_right.y = m_look.y = 0.0f;
  63.     D3DXVec3Normalize(&m_look, &m_look);
  64.     D3DXVec3Normalize(&m_right, &m_right);
  65.  
  66.     //Move Focus (i.e. Scroll)
  67.     if(mouse.x < mouse.m_viewport.left + 10)Scroll(-m_right * timeDelta * 5.0f);
  68.     if(mouse.x > mouse.m_viewport.right - 10)Scroll(m_right * timeDelta * 5.0f);
  69.     if(mouse.y < mouse.m_viewport.top + 10)Scroll(m_look * timeDelta * 5.0f);
  70.     if(mouse.y > mouse.m_viewport.bottom - 10)Scroll(-m_look * timeDelta * 5.0f);
  71.  
  72.     //Move Camera (i.e. Change Angle)
  73.     if(KEYDOWN(VK_LEFT))Yaw(-timeDelta);
  74.     if(KEYDOWN(VK_RIGHT))Yaw(timeDelta);
  75.     if(KEYDOWN(VK_UP))Pitch(timeDelta);
  76.     if(KEYDOWN(VK_DOWN))Pitch(-timeDelta);
  77.     
  78.     //Zoom (i.e. change m_fov)
  79.     if(KEYDOWN(VK_ADD))Zoom(-timeDelta);
  80.     if(KEYDOWN(VK_SUBTRACT))Zoom(timeDelta);
  81.  
  82.     //Change m_radius
  83.     if(mouse.WheelUp())  ChangeRadius(-1.0f);
  84.     if(mouse.WheelDown())ChangeRadius(1.0f);
  85.  
  86.     //Calculate Eye Position
  87.     float sideRadius = m_radius * cos(m_beta);
  88.     float height = m_radius * sin(m_beta);
  89.  
  90.     m_eye = D3DXVECTOR3(m_focus.x + sideRadius * cos(m_alpha),
  91.                       m_focus.y + height, 
  92.                       m_focus.z + sideRadius * sin(m_alpha));
  93.  
  94.     if(m_pDevice != NULL)
  95.     {
  96.         m_pDevice->SetTransform(D3DTS_VIEW, &GetViewMatrix());
  97.         m_pDevice->SetTransform(D3DTS_PROJECTION, &GetProjectionMatrix());
  98.     }
  99. }
  100.  
  101. D3DXMATRIX CAMERA::GetViewMatrix()
  102. {
  103.     D3DXMATRIX  matView;
  104.     D3DXMatrixLookAtLH(&matView, &m_eye, &m_focus, &D3DXVECTOR3(0.0f, 1.0f, 0.0f));
  105.  
  106.     m_right.x = matView(0,0);
  107.     m_right.y = matView(1,0);
  108.     m_right.z = matView(2,0);
  109.     D3DXVec3Normalize(&m_right, &m_right);
  110.  
  111.     m_look.x = matView(0,2);
  112.     m_look.y = matView(1,2);
  113.     m_look.z = matView(2,2);
  114.     D3DXVec3Normalize(&m_right, &m_right);
  115.  
  116.     return  matView;
  117. }
  118.  
  119. D3DXMATRIX CAMERA::GetProjectionMatrix()
  120. {
  121.     D3DXMATRIX  matProj;
  122.     float aspect = 800.0f / 600.0f;
  123.     D3DXMatrixPerspectiveFovLH(&matProj, m_fov, aspect, 1.0f, 1000.0f );
  124.     return matProj;
  125. }